package com.mastercard.assets.web.struts.actions;

import com.mastercard.assets.MasterCardException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.jpa.TblNivel;
import com.mastercard.assets.jpa.TblProducto;
import com.mastercard.assets.jpa.TblRole;
import com.mastercard.assets.jpa.TblTipoCampania;
import com.mastercard.assets.jpa.TblTipoProducto;
import com.mastercard.assets.jpa.TblUsuario;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.GenerarCampanaRegistrarForm;
import com.mastercard.assets.web.util.to.UserLogin;
import java.util.logging.Level;
import java.util.logging.Logger;

public class GenerarCampanaPaso2
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
                
                
//		GenerarCampanaRegistrarForm f = ( GenerarCampanaRegistrarForm ) form ;
                String[] f2 = request.getParameterValues("GenerarCampanaRegistrarForm");
                String d = request.getParameter("GeCaReFo") ;
                GenerarCampanaRegistrarForm obj = new GenerarCampanaRegistrarForm();
                obj.getNombre();
                List<TblTipoCampania> tipoCampanias = MasterCardDAO.ActiveCampaingTypeById( obj.getTipoCampania( ) ) ;
                        request.setAttribute( "TipoCampanias" , tipoCampanias );
                        
                int[ ] tipoprod = obj.getTipoProducto();// f.getTipoProducto( ) ;
                        List< TblTipoProducto > tipoProd = new ArrayList< TblTipoProducto >( ) ;
                        
                        for ( int x = 0 ; x < tipoprod.length ; x++ )
                        {
                            try {
                                    List< TblTipoProducto > TipoProd = MasterCardDAO.getActiveProductTypesById( tipoprod[ x ] ) ;
                                    
                                    for ( TblTipoProducto tiPro : TipoProd )
                                    {
                                        tipoProd.add( tiPro );
                                    }
                                    
                                } catch (MasterCardException ex) {
                                    MasterCardDAO.closeEntityManager( ) ;
                                        Logger.getLogger(GenerarCampanaRegistrar.class.getName()).log(Level.SEVERE, null, ex);
                                    }
                        }
                        
                        request.setAttribute( "tipoProducto" , tipoProd );
                        
//                        try
//		{
//			List< TblTipoProducto > tipoProductos = MasterCardDAO.getAllActiveProductTypes( ) ;
//			// guarda en el request
//			if( tipoProductos != null && tipoProductos.size( ) > 0 )
//				request.setAttribute( "TipoProductos" , tipoProductos ) ;
//			else
//			{
//				return mapping.findForward( "NoTipoProducts" ) ;
//			}
//		}catch( Exception e )
//		{
//			request.setAttribute( "Productos" , new ArrayList< TblProducto >( ) ) ;
//		}
                        
                        // toma el parametro de tipo de productos
		int[ ] tipoProductoS = obj.getTipoProducto() ;
                
                int[ ] ProductoS = obj.getProducto( ) ;
                List< TblProducto > Product = new ArrayList< TblProducto >( ) ;
                // toma todos los productos activos.
		List< TblProducto > productos = new ArrayList< TblProducto >( ) ;
                
                try
		{
                    for ( int x = 0 ; x < ProductoS.length ; x++ )
                    {
                        Product = MasterCardDAO.getActiveProductById( ProductoS[ x ] ) ;
                        
                        for ( TblProducto tPro : Product )
                        {
                            productos.add( tPro ) ;
                        }
                    }
			//productos = MasterCardDAO.getAllActiveProduct( ) ;
		}catch( Exception e )
		{
                    MasterCardDAO.closeEntityManager( ) ;
			productos = new ArrayList< TblProducto >( ) ;
		}
                
                // productos totales
			List< TblProducto > productosFinal = new ArrayList< TblProducto >( ) ;
                        
                        try
			{
				// recorre productos
				for( TblProducto p : productos )
				{
					// para cada producto revisa si es del tipoProducto venido
					// recorre los tipoProductos
					for( int tp : tipoProductoS )
					{
						// en csao de 0
						if( tp == 0 )
						{
							// lo incluye
							productosFinal.add( p ) ;
							
							// quiebra el cilo
							break ;
						}
						// en caso d que no sea
						else
						{
							// compara 
							if( p.getTblTipoProducto( ).getCveTipoProducto( ) == tp )
							{
								// agrega
								productosFinal.add( p ) ;
								
								// quiebra el cilo
								break ;
							}
						}
					}// ermina el for para recorrer tiposproducot
					
				}// termina for para recorrer productos
				
				// guarda en el request
				if( productosFinal != null && productosFinal.size( ) > 0 )
					request.setAttribute( "Productos" , productosFinal ) ;
				else
				{
					request.setAttribute( "Productos" , new ArrayList< TblProducto >( ) ) ;
				}
			}catch( Exception e )
			{
                            MasterCardDAO.closeEntityManager( ) ;
				request.setAttribute( "Productos" , new ArrayList< TblProducto >( ) ) ;
			}
                        
                        try
		{
			// role de banco
			TblRole roleBanco = MasterCardDAO.findRoleById( 3 ) ;
			
			// en caso de que sea null
//	no;Mapping		if( roleBanco == null )
//				return mapping.findForward( "NoRole" ) ;
			
			List< TblNivel > niveles = roleBanco.getTblNivels( ) ;
			
			// guarda en el request
			if( niveles != null && niveles.size( ) > 0 )
			{
				List< TblNivel > nivelesFin = new ArrayList< TblNivel >( ) ;
				
				// recorre niveles
				for( TblNivel nivel : niveles )
				{
					// verifica que no este inactivo
					if( nivel.getStatus( ) == 1 )
						// agrega si no esta inaacivo
						nivelesFin.add( nivel ) ;
				}
				
				request.setAttribute( "Niveles" , nivelesFin ) ;
			}
			else
				request.setAttribute( "Niveles" , new ArrayList< TblNivel >( ) ) ;
		}catch( Exception e )
		{
                    MasterCardDAO.closeEntityManager( ) ;
			request.setAttribute( "Productos" , new ArrayList< TblNivel >( ) ) ;
		}
                        
                try
		{
			List< TblUsuario > usuarios = MasterCardDAO.getAllActiveUsersFromBancoRoleAndCount( 
                                user.getActualCountId( ), user.getTblUsuario( ).getTblPais( ).getCvePais( ) ) ;
			// guarda en el request
			if( usuarios != null )
				request.setAttribute( "Usuarios" , usuarios ) ;
			else
				request.setAttribute( "Usuarios" , new ArrayList< TblUsuario >( ) ) ;
		}catch( Exception e )
		{
                    MasterCardDAO.closeEntityManager( ) ;
			request.setAttribute( "Usuarios" , new ArrayList< TblUsuario >( ) ) ;
		}
                
                obj.setCveCuenta( user.getActualCountId( ) ) ;
		
		// sube todos los productos a memoria
		request.setAttribute( "AllProducts" , productos ) ;
                
		
                MasterCardDAO.closeEntityManager( ) ;
                return mapping.findForward( "success" ) ;
	}
	
}